今天我們將討論 Firmware 的取得管道以及如何選擇適合自己的目標。雖然筆者到現在也還在摸索中,但希望可以分享之前踩過的幾個小坑避雷><
再開始前想先談談關於目標選擇,很推薦可以看看 DEVCORE 資深研究員 NiNi(@terrynini38514)在2025年 SITCON 以及同年的 AIS3 營隊課程中的演講:獨自升級的駭客:自由之路從框架開始
Blog 內文
其中很私以為可以仔細去重新思考的部分是關於"目標導向的學習",同時也是本篇鐵人賽真正想要嘗試的方向。比起通讀基礎理論,實際的 Get your hands dirty 、在實踐目標的過程不斷嘗試與挫折才是最快的學習方法。
延伸閱讀
與心靈雞湯(?)
- Why you Can't stick to anything https://youtu.be/knVaCNiH-8I?si=fg8UJqIbn2hszkri
- Career with ppl having too many interests https://youtu.be/EFI3DcUt7xk?si=eTU3RQ1QAX_pn8nG
首先,作為一個好像什麼都會一點但什麼都不太會的新手,選擇一個太新、又加密又 RTOS 的設備作為起始似乎太過不切實際,因此可以先從有參考資料/前人軌跡的方向開始著手,比如被打爛的路由器和 NAS 設備,經典會成為經典有其原因。或是簡單一點,看看你家有些什麼?
再往細分析的話:
選定標的後的下一步是蒐集資料,除了上網搜尋過往CVE之外,拿到韌體也很重要,但現實是不一定可以輕易取得這類資料,搜尋 IoT設備的名稱和firmware 等關鍵字後就跟抽卡一樣,會遇到以下情況:
部分廠商會在官網提供 Firmware 載點,可以直接選定對應的版本下載到對應的韌體,給到ㄅ級分,OSINT 時間 -100。
常見的廠商,如 TP-Link、ASUS、Synology 等都可以從官網中找到,下載到 .bin、.img、.trx 、.deb 等壓縮韌體檔案
雖然官網沒有,但許多韌體備份資料庫或是 github repo 中有機率搜到對應的版本內容,但也需要重複驗證hash跟內容完整性,給到ㄆ級分
參考ref:firmware.center
有些廠商僅會放上最新版本的韌體,因此可以透過 Internet Archive 等 web archive 坐時光機回到曾經的版本。
當其他方法都找不到的時候,會進入痛苦硬體時
間,可以透過不同的硬體介面與工具取得裝置中的 Firmware Image 或 Memory Dump,嘗試在裝置啟動或 Debug 模式下將韌體內容讀出。但機率性把設備戳壞或是小失敗
回憶 day2 中提到的韌體外接實體介面,可以透過貴貴的硬體debug工具去嘗試是否有預設未關閉的服務可以進行讀取
UART Dump:最常見且相對容易嘗試的方法之一。沒有確實關閉 bootloader 讀取功能的硬體,可以透過一顆 USB-TTL 轉接器將設備電路板上的 UART 接口外接,在 Bootloader 階段將記憶體內容 dump 出。[3]
JTAG:透過沒有關閉的 JTAG debug port 直接存取 CPU 內,可以整片 dump flash,也能做 runtime debugging。通常會先找到 JTAG 接口(Jtagulator進行自動枚舉和互動交互很方便)
(Jtagulator debugging[4])
SPI Flash 讀取:如果韌體儲存在外部 SPI NOR Flash,可以繞過 CPU,直接使用 Flash Programmer(e.g., CH341A)讀取 Flash Image。
實際操作時,還需要確認電壓、Pin 定義以及裝置是否啟用了 Debug Lock、Readout Protection 或其他安全機制。
具體更多的操作步驟與工具細節留到 Day 5 再進一步展開。
明天會來介紹拿到韌體後的第一個DLC:加密韌體和錯置的檔案系統
[1]Firmware Analysis Toolkit
[2]IoT Security 101
[3]https://xpart.org/product/usb-to-ttl-converter-usb-to-uart-module/
[4]https://www.seeleypentecost.com/posts/2020-08-21-building-a-jtagulator/